package fr.charlott.business.dto;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

import org.apache.commons.lang.StringUtils;

import fr.charlott.core.repository.model.TailleBas;
import fr.charlott.core.repository.model.TailleHaut;

public class PersonneDTO implements Serializable {

	private static final long serialVersionUID = -1043002730549693377L;

	private Long id;

	@NotNull
	@Size(min = 2, max = 50, message = "Le nom doit etre defini")
	private String nom;

	@NotNull
	@Size(min = 2, max = 50, message = "Le prenom doit etre defini")
	private String prenom;

	@Past
	private Date dateDeNaissance;

	// Adresse
	@Valid
	private AdresseDTO adresse;

	private TailleHaut tailleHaut;
	
	private TailleBas tailleBas;
	
	@Valid
	private List<ProduitDTO> produits;
	
	private String achats;
	
	private String commentaires;
	
	private String preferences;

	@Past
	private Date derniereVisite;
	
	// constructeurs

	public PersonneDTO() {
		super();
		this.adresse = new AdresseDTO();
	}

	public PersonneDTO(AdresseDTO adresse) {
		super();
		this.adresse = adresse;
	}

	// Champ calculé
	
	public int getAge() {
		if (dateDeNaissance != null) {
			Calendar aujourdhui = new GregorianCalendar();
			Calendar date = new GregorianCalendar();
			date.setTime(dateDeNaissance);

			int delta = (aujourdhui.get(Calendar.YEAR) - 1900) - (date.get(Calendar.YEAR) - 1900);
			if (date.get(Calendar.MONTH) < aujourdhui.get(Calendar.MONTH)) {
				return delta;
			} else {
				return Math.max(0, delta - 1); // pour eviter le -1 pour les baby
			}
		} else {
			return 0;
		}
	}
	
	public Date getAnniversaire(){
		if (dateDeNaissance != null) {
			int year = new GregorianCalendar().get(Calendar.YEAR);
			
			Calendar date = new GregorianCalendar();
			date.setTime(dateDeNaissance);
			date.set(Calendar.YEAR, year);
			
			return date.getTime();
		}
		return dateDeNaissance;
	}

	@Override
	public String toString() {
		return "" + (prenom != null ? prenom + " " : "") + (nom != null ? nom : "");
	}

	// setters - getters

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = StringUtils.upperCase(nom);
	}

	public String getPrenom() {
		return StringUtils.capitalize(prenom);
	}

	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public Date getDateDeNaissance() {
		return dateDeNaissance;
	}

	public void setDateDeNaissance(Date dateDeNaissance) {
		this.dateDeNaissance = dateDeNaissance;
	}

	public AdresseDTO getAdresse() {
		return adresse;
	}

	public void setAdresse(AdresseDTO adresse) {
		this.adresse = adresse;
	}

	public TailleHaut getTailleHaut() {
		return tailleHaut;
	}

	public void setTailleHaut(TailleHaut tailleHaut) {
		this.tailleHaut = tailleHaut;
	}
	
	public TailleBas getTailleBas() {
		return tailleBas;
	}

	public void setTailleBas(TailleBas tailleBas) {
		this.tailleBas = tailleBas;
	}

	public List<ProduitDTO> getProduits() {
		return produits;
	}
	
	public String getProduitsAsString(){
		StringBuilder sb = new StringBuilder();
		if (produits.size() > 0){
			for (ProduitDTO produit : produits) {
				sb.append(produit.getReference());
				sb.append(",");
			}
		}
		return sb.toString();
	}

	public void setProduits(List<ProduitDTO> produits) {
		this.produits = produits;
	}

	public String getCommentaires() {
		return commentaires;
	}

	public void setCommentaires(String commentaires) {
		this.commentaires = commentaires;
	}

	public Date getDerniereVisite() {
		return derniereVisite;
	}

	public void setDerniereVisite(Date derniereVisite) {
		this.derniereVisite = derniereVisite;
	}

	public String getPreferences() {
		return preferences;
	}

	public void setPreferences(String preferences) {
		this.preferences = preferences;
	}

	public String getAchats() {
		return achats;
	}

	public void setAchats(String achats) {
		this.achats = achats;
	}

}
